package com.odontosis.relatorio.pagamentoperiodo;

import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;
import com.odontosis.entidade.Recibo;
import com.odontosis.entidade.ReciboDetalhe;
import com.odontosis.entidade.TipoRecibo;
import com.odontosis.entidade.TipoServico;
import com.odontosis.entidade.Usuario;
import com.odontosis.ioc.ContainerIoc;
import com.odontosis.service.ReciboService;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoRelatorioPagamentoEfetuado extends OdontosisAction<ReciboService> {
	
	/**
	 * Mtodo principal da ao. 
	 */
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioPagamentoEfetuado formRelatorio = (FormRelatorioPagamentoEfetuado) actionForm;

		return super.execute(mapping, actionForm, request, response);
	}
	
	public ActionForward vizualizar(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioPagamentoEfetuado formRelatorio = (FormRelatorioPagamentoEfetuado) actionForm;
		
		
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		Calendar inicio = Calendar.getInstance();
		inicio.setTime(formato.parse(formRelatorio.getDataInicial()));
		inicio.set(Calendar.HOUR, 0);
		inicio.set(Calendar.MINUTE, 0);
		inicio.set(Calendar.SECOND, 0);
		
		Calendar fim = Calendar.getInstance();
		fim.setTime(formato.parse(formRelatorio.getDataFinal()));
		fim.set(Calendar.HOUR, 23);
		fim.set(Calendar.MINUTE, 59);
		fim.set(Calendar.SECOND, 59);
		
		TipoRecibo tipoRecibo = null;
		if(!StringUtilsOdontosis.isVazia(formRelatorio.getTipo())){
			tipoRecibo = TipoRecibo.recuperarPorCodigo(Integer.parseInt(formRelatorio.getTipo())); 
		}
		
		Usuario usuario = null;
		if(!StringUtilsOdontosis.isVazia(formRelatorio.getUsuario())) {
			usuario = ContainerIoc.getUsuarioService().load(Long.parseLong(formRelatorio.getUsuario()));
		}
		gerarRelatorio(inicio.getTime(), fim.getTime() , formRelatorio.getPaciente(),tipoRecibo, usuario, response);
		
		return null;
	}
	
	
	public void gerarRelatorio(Date inicio, Date fim, String paciente,TipoRecibo tipo, Usuario usuario,  HttpServletResponse response){
		try{
			//fontes
			Font fontItem = new Font(Font.HELVETICA, 10, Font.NORMAL);
	        Font fontTotal = new Font(Font.HELVETICA, 10, Font.BOLD);
	        Font fonteTitulo = new Font(Font.HELVETICA, 11, Font.BOLD);
	        Font fonteCabecalho = new Font(Font.HELVETICA, 13, Font.BOLD);
	        
			//inicializa documento
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			Document document = new Document(PageSize.A4);
			PdfWriter.getInstance(document, baos);
			document.open();
			
			Collection<Recibo> resultado = service.relatorioPagamentosEfetuados(paciente, inicio, fim,tipo, usuario);
			
			//define o titulo
			SimpleDateFormat formata = new SimpleDateFormat("dd/MM/yyyy");
			String dataInicio = formata.format(inicio.getTime());
			String dataFim = formata.format(fim.getTime());
			formata = new SimpleDateFormat("dd/MM/yyyy HH:mm");
			
			
			
			String periodo =  dataInicio + " até "+ dataFim;
			String tituloRelatorio = "Relatório dos Pagamentos Efetuados \n  de "+periodo;
			if(usuario != null) {
				tituloRelatorio += "\nResponsável: " + usuario.getNome();
			}
			Paragraph paragrafoTitulo = new Paragraph(new Phrase(tituloRelatorio, fonteCabecalho));
            paragrafoTitulo.setAlignment(1);
            document.add(paragrafoTitulo);
			
			//cria a tabela
			float [] tamanhos = {1,2.5f,1.3f,1.2f,0.8f, 1};
			Table table = criarObjetoTabela(6, tamanhos);
			
			Cell t1 = new Cell(new Phrase("Nº Pasta", fonteCabecalho));
			t1.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(t1);
			
			Cell t2 = new Cell(new Phrase("Paciente", fonteCabecalho));
			t2.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t2);

			
			Cell t3 = new Cell(new Phrase("Data - Hora", fonteCabecalho));
			t3.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t3);
			
			Cell t4 = new Cell(new Phrase("Vencimento", fonteCabecalho));
			t4.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t4);
			
			Cell t6 = new Cell(new Phrase("Parcela", fonteCabecalho));
			t6.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t6);
			
			Cell t5 = new Cell(new Phrase("Valor", fonteCabecalho));
			t5.setBackgroundColor(new Color(236, 235, 234));
			table.addCell(t5);
			
			
			double total = 0.0;
			//totalizadores
			int pfcomcpf = 0;
			int pfsemcpf = 0;
			int pj = 0;
			for (Recibo recibo : resultado) {
					switch (recibo.getTipoRecibo()) {
					case PFCOMCPF:
						pfcomcpf++;
						break;
					case PFSEMCPF:
						pfsemcpf++;
						break;
					case PJ:
						pj++;
						break;
					default:
						break;
					}
				
					Cell npasta = new Cell(new Phrase(StringUtilsOdontosis.colocaZeros(recibo.getPagamento().getServico().getPacienteServico().getNumeroPasta(),10), fontItem));
					table.addCell(npasta);
					
					
					Cell paciente1 = new Cell(new Phrase(recibo.getPagamento().getServico().getPacienteServico().getNome(), fontItem));
					table.addCell(paciente1);
					
					Cell data = new Cell(new Phrase(formata.format(recibo.getData()), fontItem));
					table.addCell(data);
					
					
					
					
					if(!recibo.getListaReciboDetalhe().isEmpty()) {
						boolean primeiro = true;
						for(ReciboDetalhe detalhe : recibo.getListaReciboDetalhe()) {
							if(!primeiro) {
								Cell vazia = new Cell();
								vazia.setColspan(3);
								table.addCell(vazia);
							}
							
							Cell vencimento = new Cell(new Phrase(detalhe.getPagamento().getMesVencimento() + "/" + detalhe.getPagamento().getAnoVencimento(), fontItem));
							table.addCell(vencimento);
							
							String textoParcela = detalhe.getPagamento().getNumeroParcela();
							Cell parcela = new Cell(new Phrase(textoParcela, fontItem));
							parcela.setHorizontalAlignment(Cell.ALIGN_CENTER);
							table.addCell(parcela);
							
							Cell valor = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(detalhe.getValor().doubleValue()), fontItem));
							table.addCell(valor);
							primeiro = false;
						}
						
					} else {
						
						Cell vencimento = new Cell(new Phrase(recibo.getPagamento().getMesVencimento() + "/" + recibo.getPagamento().getAnoVencimento(), fontItem));
						table.addCell(vencimento);
						
						String textoParcela = recibo.getNumeroParcela();
						Cell parcela = new Cell(new Phrase(textoParcela, fontItem));
						parcela.setHorizontalAlignment(Cell.ALIGN_CENTER);
						table.addCell(parcela);
						
						Cell valor = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(recibo.getValor().doubleValue()), fontItem));
						table.addCell(valor);
					}
					
					
					
					
					
					total += recibo.getValor().doubleValue();
				
				
			}
			
			
			 
			
			Cell rodape = new Cell(new Phrase("Valor Total",fontTotal));
			rodape.setColspan(5);
			rodape.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(rodape);
			
			Cell totaliza = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(total)));
			totaliza.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(totaliza);
			
			
			document.add(table);
			document.close();
			response.setContentType("application/pdf");
			response.setContentLength(baos.size());
			ServletOutputStream out = response.getOutputStream();
			baos.writeTo(out);
			out.flush();
			
		
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
	private Table criarObjetoTabela(int numColunas, float[] headerWidths) {
	        try {
	            Table aTable = new Table(numColunas);

	            aTable.setPadding(1);
	            aTable.setSpacing(0);

	            aTable.setWidths(headerWidths);

	            aTable.widthPercentage();
	            aTable.setWidth(100);
	            aTable.setBorder(0);

	            aTable.setSpaceBetweenCells(0);

	            aTable.setDefaultCellBorderWidth(0);
	            aTable.setBorder(0);

	            return aTable;
	        } catch (BadElementException e) {
	            throw new RuntimeException("Erro definindo largura do cabeçalho", e);
	        }
	    }

}
